{
    /*基本定义*/
    class Parent {//通过class关键字定义一个类
        constructor(age,name) {//通过构造函数来为这个类的实例对象添加属性，this指向这个类的实例对象
            this.age = age;
            this.name=name;
        }
        /*特别注意：
        * 这里的get和set是关键字。
        * longName是属性（隐藏属性）！！！（可以看做是对name（基本属性）属性的加工方法）
        * 这里定义的是，当访问longName属性时(ex: o.longName),调用set后{}中的方法。
        * 同理get 也一样。
        * 注意：当用console打印时，隐藏属性没有没打印出来，在折叠里
        * */
        get longName(){
            return this.name+'ss';
        }
        set longName(name){
            this.name=name;
        }
        sayBye(){//定义实例对象的方法
            console.log('bye!')
        }
        static sayHello(){//定义类对象的方法，它的实例对象没有
            console.log('hello!')
        }
    }

    let p1 = new Parent(11,'hhj');
    console.log(p1.age, p1);

    /*继承*/
    class Child extends Parent {
        constructor(age,name) {
            super(age,name);//继承时必须用super关键字调用父类的构造方法，因为child的age属性来自于Parent所以要传值给Parent
        }
    }
    let c1=new Child(21,'hhj');
    c1.longName='hc';
    console.log(c1.longName);

    c1.sayBye();
    Child.sayHello();

    Child.type='hh';//定义类对象的属性，它的实例对象没有
    console.log(Child.type);

    /*特别注意！！！！！！！
    * 和java不同，类对象与类的实例对象关系不一样。
    * es5之前是没有类这个概念的，通过构造函数来新建实例，
    * es6后才有的类概念(关键字)，其实class关键字只是个语法糖，本质上还是通过构造函数创建的实例对象，不过是多出来了一个类对象（构造函数对象）
    * 所以和java的类的概念不同：类对象有自己有属性和方法，类创建出来的实例对象也有自已的属性和方法，它们不相同。
    * 可以看做是A对象（类），有创建B对象(实例对象)的能力。
    * */
}